home *** CD-ROM | disk | FTP | other *** search
- /*
- * Copyright (c) 1992 The Regents of the University of California.
- * All rights reserved.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose, without fee, and without written agreement is
- * hereby granted, provided that the above copyright notice and the following
- * two paragraphs appear in all copies of this software.
- *
- * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
- * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF
- * CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
- #include "video.h"
- #include <sys/types.h>
- #include <signal.h>
- #include <netinet/in.h>
- #include "util.h"
-
- /* Define buffer length. */
-
- #define BUF_LENGTH 80000
-
- /* Function return type declarations */
- void usage();
-
- /* External declaration of main decoding call. */
-
- extern VidStream *mpegVidRsrc();
- extern VidStream *NewVidStream();
-
- /* Global file pointer to incoming data. */
- FILE *input;
-
- /* End of File flag. */
- static int EOF_flag = 0;
-
- /* Loop flag. */
- int loopFlag = 0;
-
- /* Setjmp/Longjmp env. */
- jmp_buf env;
-
-
- /*
- *--------------------------------------------------------------
- *
- * get_more_data --
- *
- * Called by correct_underflow in bit parsing utilities to
- * read in more data.
- *
- * Results:
- * Input buffer updated, buffer length updated.
- * Returns 1 if data read, 0 if EOF, -1 if error.
- *
- * Side effects:
- * None.
- *
- *--------------------------------------------------------------
- */
-
- int
- get_more_data(buf_start, max_length, length_ptr, buf_ptr)
- unsigned int *buf_start;
- int max_length;
- int *length_ptr;
- unsigned int **buf_ptr;
- {
-
- int length, num_read, i, request;
- unsigned char *buffer, *mark;
- unsigned int *lmark;
-
- if (EOF_flag) return 0;
-
- length = *length_ptr;
- buffer = (unsigned char *) *buf_ptr;
-
- if (length > 0) {
- memcpy((unsigned char *) buf_start, buffer, (length*4));
- mark = ((unsigned char *) (buf_start + length));
- }
- else {
- mark = (unsigned char *) buf_start;
- length = 0;
- }
-
- request = (max_length-length)*4;
-
- num_read = fread( mark, 1, request, input);
-
- if (num_read < 0) {
- return -1;
- }
- else if (num_read == 0) {
- *buf_ptr = buf_start;
-
- /* Make 32 bits after end equal to 0 and 32
- bits after that equal to seq end code
- in order to prevent messy data from infinite
- recursion.
- */
-
- *(buf_start + length) = 0x0;
- *(buf_start + length+1) = SEQ_END_CODE;
-
- EOF_flag = 1;
- return 0;
- }
-
- lmark = (unsigned int *) mark;
-
- num_read = num_read/4;
-
- for (i=0; i<num_read; i++) {
- *lmark = htonl(*lmark);
- lmark++;
- }
-
- *buf_ptr = buf_start;
- *length_ptr = length + num_read;
-
- return 1;
- }
-
- /*
- *--------------------------------------------------------------
- *
- * int_handler --
- *
- * Handles Cntl-C interupts..
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *--------------------------------------------------------------
- */
- void
- int_handler()
- {
- fprintf(stderr, "Interrupted!\n");
- if (curVidStream != NULL)
- DestroyVidStream(curVidStream);
- exit(1);
- }
-
- /* global - writes binary data to stdout if set */
- int writeToStdout;
-
- /*
- *--------------------------------------------------------------
- *
- * main --
- *
- * Parses command line, starts decoding and displaying.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *--------------------------------------------------------------
- */
-
- void main(argc, argv)
- int argc;
- char **argv;
- {
- static VidStream *theStream;
- int mark;
- int i;
-
- writeToStdout = 1;
- mark = 1;
- argc--;
-
- input = stdin;
-
- while (argc) {
- if (strcmp(argv[mark], "-nop") == 0) {
- TogglePFlag();
- argc--; mark++;
- }
- else if (strcmp(argv[mark], "-nob") == 0) {
- ToggleBFlag();
- argc--; mark++;
- }
- else if (strcmp(argv[mark], "-toFile") == 0) {
- writeToStdout = 0;
- argc--; mark++;
- }
- else if (strcmp(argv[mark], "-loop") == 0) {
- argc--; mark++;
- loopFlag = 1;
- }
- else
- if (argv[mark][0] == '-') {
- fprintf(stderr, "Un-recognized flag %s\n",argv[mark]);
- usage(argv[0]);
- }
- else {
- input = fopen(argv[mark], "r");
- if (input == NULL) {
- fprintf(stderr, "Could not open file %s\n", argv[mark]);
- usage(argv[0]);
- }
- argc--; mark++;
- }
- }
-
- signal(SIGINT, int_handler);
-
- init_tables();
- InitColorDither();
-
- if (setjmp(env) != 0) {
- DestroyVidStream(theStream);
- rewind(input);
- EOF_flag = 0;
- curBits = 0;
- bitOffset = 0;
- bufLength = 0;
- bitBuffer = NULL;
- totNumFrames = 0;
- }
-
- theStream = NewVidStream(BUF_LENGTH);
- mpegVidRsrc(0, theStream);
- i = 1;
-
- realTimeStart = ReadSysClock();
-
- while (1) { /* Ctl-C to exit if in loop mode */
- mpegVidRsrc(0, theStream);
- }
- }
-
-
- /*
- *--------------------------------------------------------------
- *
- * usage --
- *
- * Print mpeg_play usage
- *
- * Results:
- * None.
- *
- * Side effects:
- * exits with a return value -1
- *
- *--------------------------------------------------------------
- */
-
- void
- usage(s)
- char *s; /* program name */
- {
- fprintf(stderr, "Usage:\n");
- fprintf(stderr, "mpeg_play\n");
- fprintf(stderr, " [-nob]\n");
- fprintf(stderr, " [-nop]\n");
- fprintf(stderr, " [-loop]\n");
- fprintf(stderr, " file_name\n");
- exit (-1);
- }
-